0532. 数组中的 k-diff 数对【中等】
1. 📝 题目描述
给你一个整数数组 nums 和一个整数 k,请你在数组中找出 不同的 k-diff 数对,并返回不同的 k-diff 数对 的数目。
k-diff 数对定义为一个整数对 (nums[i], nums[j]),并满足下述全部条件:
0 <= i, j < nums.lengthi != j|nums[i] - nums[j]| == k
注意,|val| 表示 val 的绝对值。
示例 1:
txt
输入:nums = [3, 1, 4, 1, 5], k = 2
输出:2
解释:数组中有两个 2-diff 数对, (1, 3) 和 (3, 5)。
尽管数组中有两个 1,但我们只应返回不同的数对的数量。1
2
3
4
2
3
4
示例 2:
txt
输入:nums = [1, 2, 3, 4, 5], k = 1
输出:4
解释:数组中有四个 1-diff 数对, (1, 2), (2, 3), (3, 4) 和 (4, 5)。1
2
3
2
3
示例 3:
txt
输入:nums = [1, 3, 1, 5, 4], k = 0
输出:1
解释:数组中只有一个 0-diff 数对,(1, 1)。1
2
3
2
3
提示:
1 <= nums.length <= 10^4-10^7 <= nums[i] <= 10^70 <= k <= 10^7
2. 🎯 s.1 - 哈希表
c
int cmp(const void* a, const void* b) { return *(int*)a - *(int*)b; }
int findPairs(int* nums, int numsSize, int k) {
qsort(nums, numsSize, sizeof(int), cmp);
int count = 0;
for (int i = 0; i < numsSize; i++) {
if (i > 0 && nums[i] == nums[i - 1]) continue;
// 二分查找 nums[i]+k
int lo = i + 1, hi = numsSize - 1;
while (lo <= hi) {
int mid = lo + (hi - lo) / 2;
if (nums[mid] == nums[i] + k) { count++; break; }
else if (nums[mid] < nums[i] + k) lo = mid + 1;
else hi = mid - 1;
}
}
return count;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
js
/**
* @param {number[]} nums
* @param {number} k
* @return {number}
*/
var findPairs = function (nums, k) {
const freq = new Map()
for (const num of nums) freq.set(num, (freq.get(num) || 0) + 1)
let count = 0
for (const [num, cnt] of freq) {
if (k === 0) {
if (cnt > 1) count++
} else if (freq.has(num + k)) count++
}
return count
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
py
class Solution:
def findPairs(self, nums: List[int], k: int) -> int:
freq = Counter(nums)
count = 0
for num in freq:
if k == 0:
if freq[num] > 1:
count += 1
else:
if num + k in freq:
count += 1
return count1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
- 时间复杂度:
- 空间复杂度:
算法思路:
- 统计每个数的出现次数
- 若
,统计出现次数 > 1 的数 - 若
,检查num + k是否存在